package com.tp2.dominio;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.tp2.bo.Oferta;
import com.tp2.bo.impl.ProductoCompra;

public class CalculadorDeDescuentos {
	
	private static CalculadorDeDescuentos calculador;
	private Calendario calendario;

	private CalculadorDeDescuentos(){
		
		calendario = Calendario.getInstance();
		
	}
		
	public static CalculadorDeDescuentos getInstance(){
		
		if (calculador == null){
			calculador = new CalculadorDeDescuentos();
		}
		
		return calculador;
		
	}

	public List<Descuento> aplicarOfertas(List<Producto> productos, MedioDePago medioDePago) {
		
		List<Descuento> descuentos = new ArrayList<Descuento>();
		List<Oferta> ofertasVigentesHoy = calendario.dameOfertasVigentes();
		
		ordenarOfertas(ofertasVigentesHoy);
		
		List<ProductoCompra> productosComprados = crearProductosCompra(productos);
	
		for(Oferta oferta: ofertasVigentesHoy){
			descuentos.addAll(oferta.aplicar(productosComprados, medioDePago));
		}
		return descuentos;
	}
	
	
	private void ordenarOfertas(List<Oferta> ofertas){
		
		Collections.sort(ofertas);
	}
	
	private List<ProductoCompra> crearProductosCompra(List<Producto> productos){
		
		List<ProductoCompra> productosComprados = new ArrayList<ProductoCompra>();
		
		for (Producto producto: productos){
			
			ProductoCompra productoCompra = new ProductoCompra(producto);
			
			int index = productosComprados.indexOf(productoCompra);
			
			if (index == -1){
				productosComprados.add(productoCompra);
				
			}else{
				
				productosComprados.get(index).setCantidad(productosComprados.get(index).getCantidad() +1);
				
			}
		}
		
		return productosComprados;
		
	}	
}
